From 367cc4fc0f155acc4cb32202139299e663f50bc6 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 1 Nov 2011 02:54:03 +0100 Subject: [PATCH] entry: Handle ::grab-notify Store the device, and unset private fields whenever the device is shadowed by another GTK+ grab, so popping up menus while selecting (i.e. press-and-hold) doesn't leave the entry in a confused state. --- gtk/gtkentry.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 5137a4996d..9311f04d19 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -147,6 +147,8 @@ struct _GtkEntryPrivate GtkShadowType shadow_type; GtkWidget *popup_menu; + GdkDevice *device; + GdkDevice *completion_device; GdkWindow *text_area; @@ -547,6 +549,8 @@ static void gtk_entry_do_popup (GtkEntry *entry, GdkEventButton *event); static gboolean gtk_entry_mnemonic_activate (GtkWidget *widget, gboolean group_cycling); +static void gtk_entry_grab_notify (GtkWidget *widget, + gboolean was_grabbed); static void gtk_entry_check_cursor_blink (GtkEntry *entry); static void gtk_entry_pend_cursor_blink (GtkEntry *entry); static void gtk_entry_reset_blink_time (GtkEntry *entry); @@ -691,6 +695,7 @@ gtk_entry_class_init (GtkEntryClass *class) widget_class->state_flags_changed = gtk_entry_state_flags_changed; widget_class->screen_changed = gtk_entry_screen_changed; widget_class->mnemonic_activate = gtk_entry_mnemonic_activate; + widget_class->grab_notify = gtk_entry_grab_notify; widget_class->drag_drop = gtk_entry_drag_drop; widget_class->drag_motion = gtk_entry_drag_motion; @@ -3830,7 +3835,8 @@ gtk_entry_button_press (GtkWidget *widget, gtk_entry_reset_blink_time (entry); priv->button = event->button; - + priv->device = gdk_event_get_device ((GdkEvent *) event); + if (!gtk_widget_has_focus (widget)) { priv->in_click = TRUE; @@ -3844,6 +3850,7 @@ gtk_entry_button_press (GtkWidget *widget, { gtk_entry_do_popup (entry, event); priv->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */ + priv->device = NULL; return TRUE; } @@ -4021,9 +4028,10 @@ gtk_entry_button_release (GtkWidget *widget, priv->in_drag = 0; } - + priv->button = 0; - + priv->device = NULL; + gtk_entry_update_primary_selection (entry); return TRUE; @@ -4132,7 +4140,8 @@ gtk_entry_motion_notify (GtkWidget *widget, priv->in_drag = FALSE; priv->button = 0; - + priv->device = NULL; + gtk_target_list_unref (target_list); } } @@ -8572,6 +8581,26 @@ gtk_entry_mnemonic_activate (GtkWidget *widget, return TRUE; } +static void +gtk_entry_grab_notify (GtkWidget *widget, + gboolean was_grabbed) +{ + GtkEntryPrivate *priv; + + priv = GTK_ENTRY (widget)->priv; + + if (priv->device && + gtk_widget_device_is_shadowed (widget, priv->device)) + { + /* Unset button so we don't expect + * a button release anymore + */ + priv->button = 0; + priv->device = NULL; + priv->in_drag = FALSE; + } +} + static void append_action_signal (GtkEntry *entry, GtkWidget *menu, -- 2.30.2